/* 
 * File:   plane.cpp
 * Author: chaterolas
 * 
 * Created on 24 de junio de 2009, 09:02 PM
 */

#include "plane.h"

/**
 * Crea una instancia de plano primitivo, apartir de su nombre, material punto
 * por el que pasa y su vector normal.
 * @param name (nombre dle primitivo)
 * @param m (material que costituye este plano)
 * @param pos (punto fijo en en espacio tridimensional por donde pasa el plano)
 * @parma norm (vector normal al plano, debe de ser distinto del vecto nulo)
 */
Plane:: Plane(Material* material, double px, double py, double pz,
        double nx, double ny, double nz) {
    this->material = material;
    normal = new Vector3D(nx, ny, nz);
    normal->normalize();
    pos = new Vector3D(px, py, pz);
    light = 0;
}

/**
 * Destruye la instancia que lo llama, ademas de sus componentes pertinentes
 */
Plane::~Plane() {
    delete material;
    delete normal;
    delete pos;
}

Vector3D *Plane::getNormal(Vector3D &pos) {
    Vector3D *temp = new Vector3D(*normal);
    return temp;
}

int Plane::getType() {
    return PLANE;
}

double Plane::intersect(Ray* r) {
    double b = normal->dot(*r->getDirection());

    if(b != 0) {
        Vector3D *aux = *pos - *r->getOrigin();
        double a = aux->dot(*normal);
        double t = a / b;

        delete aux;

        if(t < 0)
            return INFINITY;
        else
            return t;
    } else {
        return INFINITY;
    }

}

